Task 20.1.2

Write function to take matrix A and output probabilities

library(plotly)
library(tidyverse)
library(lpSolve)

solve_penalty_game <- function(A) {
  if (!is.matrix(A) || any(dim(A) != c(3, 3))) stop("A must be a 3x3 matrix")
  
  # Kicker LP: max v such that t(p) %*% A >= v, sum(p) = 1, p >= 0
  f.obj <- c(0, 0, 0, 1)
  f.con <- rbind(
    c(A[1, ], -1),
    c(A[2, ], -1),
    c(A[3, ], -1),
    c(1, 1, 1, 0)
  )
  f.dir <- c(">=", ">=", ">=", "==")
  f.rhs <- c(0, 0, 0, 1)
  result <- lp("max", f.obj, f.con, f.dir, f.rhs)
  #if (result$status != 0 || is.null(result$solution)) return(rep(NA, 7))
  q_star <- result$solution[1:3] #return goalkeeper strategy
  #if (sum(q_star) == 0) return(rep(NA, 7))
  q_star <- q_star / sum(q_star)
  v_star <- result$objval

  # Goalkeeper LP: min v such that A^T %*% p <= v, sum(p) = 1, p >= 0
  g.obj <- c(0, 0, 0, 1)
  g.con <- rbind(
    c(A[,1], -1),
    c(A[,2], -1),
    c(A[,3], -1),
    c(1, 1, 1, 0)
  )
  g.dir <- c("<=", "<=", "<=", "==")
  g.rhs <- c(0, 0, 0, 1)
  result2 <- lp("min", g.obj, g.con, g.dir, g.rhs)
  #if (result2$status != 0 || is.null(result2$solution)) return(rep(NA, 7))
  p_star <- result2$solution[1:3] #return kicker strategy
  #if (sum(p_star) == 0) return(rep(NA, 7))
  p_star <- p_star / sum(p_star)

  return(c(p_star, q_star, v_star))
}
a_vals <- seq(0.0, 0.5, length.out = 8)
e_vals <- seq(0.0, 0.5, length.out = 8)
b_vals <- seq(0.5, 1.0, length.out = 8)
c_vals <- seq(0.5, 1.0, length.out = 8)
d_vals <- seq(0.5, 1.0, length.out = 8)

#EXPAND GRID
param_grid <- expand.grid(a = a_vals, b = b_vals, c = c_vals, d = d_vals, e = e_vals) 

results <- data.frame()

for (i in 1:nrow(param_grid)) {
  a <- param_grid$a[i]
  b <- param_grid$b[i]
  c <- param_grid$c[i]
  d <- param_grid$d[i]
  e <- param_grid$e[i]
  
  # Construct symmetric matrix without noise
  A <- matrix(c(
    a, b, c,
    d, e, d,
    c, b, a
  ), nrow = 3, byrow = TRUE)
  
  out <- solve_penalty_game(A)

  results <- rbind(results, data.frame(
    a = a, b = b, c = c, d = d, e = e,
    pL = out[1], pC = out[2], pR = out[3],
    qL = out[4], qC = out[5], qR = out[6],
    v = out[7]
  ))
}
library(PNWColors)
library(ggplot2)
pal = pnw_palette("Bay",100,type="continuous")
ggplot(results, aes(x = d, y = e, fill = pC)) +
  geom_tile() +
  scale_fill_gradientn(colours = pal)

  labs(
    title = "Equilibrium probability of shooting Center",
    x = "d (off-center payoff)",
    y = "e (center payoff)"
  ) +
  theme_minimal()
NULL

3D heat map based on a, d, c probability

plotly_colorscale <- lapply(0:99, function(i) {
  list(i / 99, pal[i + 1])
})

plot_ly(
  data = results,
  x = ~a, y = ~d, z = ~c, color = ~qL, type = "scatter3d", mode = "markers",
  marker = list(size = 3, colorscale = plotly_colorscale, colorbar = list(title = "q*_L")),
  showscale = TRUE
) %>%
  layout(
    title = "Goalkeeper's equilibrium probability of diving Left (q*_L)",
    scene = list(
      xaxis = list(title = "a"),
      yaxis = list(title = "d"),
      zaxis = list(title = "c")
    )
  )
Warning :'scatter3d' objects don't have these attributes: 'showscale'
Valid attributes include:
'connectgaps', 'customdata', 'customdatasrc', 'error_x', 'error_y', 'error_z', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'projection', 'scene', 'showlegend', 'stream', 'surfaceaxis', 'surfacecolor', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'visible', 'x', 'xcalendar', 'xhoverformat', 'xsrc', 'y', 'ycalendar', 'yhoverformat', 'ysrc', 'z', 'zcalendar', 'zhoverformat', 'zsrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'

Warning :'scatter3d' objects don't have these attributes: 'showscale'
Valid attributes include:
'connectgaps', 'customdata', 'customdatasrc', 'error_x', 'error_y', 'error_z', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'projection', 'scene', 'showlegend', 'stream', 'surfaceaxis', 'surfacecolor', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'visible', 'x', 'xcalendar', 'xhoverformat', 'xsrc', 'y', 'ycalendar', 'yhoverformat', 'ysrc', 'z', 'zcalendar', 'zhoverformat', 'zsrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'
n_points <- 5  # control resolution (adjust for speed vs granularity)
vals_01 <- seq(0.0, 0.5, length.out = n_points)
vals_05 <- seq(0.5, 1.0, length.out = n_points)

# Grid for a, b, c, d, e, f, g, h
grid_raw <- expand.grid(
  a = vals_01,
  b = vals_05,
  c = vals_05,
  d = vals_05,
  e = vals_01,
  f = vals_05,
  g = vals_05,
  h = vals_01
)

param_grid2 <- grid_raw %>%
  filter(a > h, b > g, c > f)

results2 <- data.frame()

for (i in 1:nrow(param_grid2)) {
  a <- param_grid2$a[i]
  b <- param_grid2$b[i]
  c <- param_grid2$c[i]
  d <- param_grid2$d[i]
  e <- param_grid2$e[i]
  f <- param_grid2$f[i]
  g <- param_grid2$g[i]
  h <- param_grid2$h[i]
  
  # Construct symmetric matrix without noise
  A <- matrix(c(
    a, b, c,
    d, e, d,
    f, g, h
  ), nrow = 3, byrow = TRUE)
  
  out <- solve_penalty_game(A)

  results2 <- rbind(results2, data.frame(
    a = a, b = b, c = c, d = d, e = e, f = f, g = g, h = h,
    pL = out[1], pC = out[2], pR = out[3],
    qL = out[4], qC = out[5], qR = out[6],
    v = out[7]
  ))
}
ggplot(results2, aes(x = d, y = e, fill = pC)) +
  geom_tile() +
  scale_fill_gradientn(colours = pal)

  labs(
    title = "Equilibrium probability of shooting Center",
    x = "d (off-center payoff)",
    y = "e (center payoff)"
  ) +
  theme_minimal()
NULL
plot_ly(
  data = results2,
  x = ~a, y = ~d, z = ~c, color = ~qL, type = "scatter3d", mode = "markers",
  marker = list(size = 3, colorscale = plotly_colorscale, colorbar = list(title = "q*_L")),
  showscale = TRUE
) %>%
  layout(
    title = "Goalkeeper's equilibrium probability of diving Left (q*_L)",
    scene = list(
      xaxis = list(title = "a"),
      yaxis = list(title = "d"),
      zaxis = list(title = "c")
    )
  )
Warning :'scatter3d' objects don't have these attributes: 'showscale'
Valid attributes include:
'connectgaps', 'customdata', 'customdatasrc', 'error_x', 'error_y', 'error_z', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'projection', 'scene', 'showlegend', 'stream', 'surfaceaxis', 'surfacecolor', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'visible', 'x', 'xcalendar', 'xhoverformat', 'xsrc', 'y', 'ycalendar', 'yhoverformat', 'ysrc', 'z', 'zcalendar', 'zhoverformat', 'zsrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'

Warning :'scatter3d' objects don't have these attributes: 'showscale'
Valid attributes include:
'connectgaps', 'customdata', 'customdatasrc', 'error_x', 'error_y', 'error_z', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'projection', 'scene', 'showlegend', 'stream', 'surfaceaxis', 'surfacecolor', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'visible', 'x', 'xcalendar', 'xhoverformat', 'xsrc', 'y', 'ycalendar', 'yhoverformat', 'ysrc', 'z', 'zcalendar', 'zhoverformat', 'zsrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'
LS0tCnRpdGxlOiAiTGFiIDIwIC0gR2FtZSBUaGVvcnkiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRhc2sgMjAuMS4yCgpXcml0ZSBmdW5jdGlvbiB0byB0YWtlIG1hdHJpeCBBIGFuZCBvdXRwdXQgcHJvYmFiaWxpdGllcwpgYGB7cn0KbGlicmFyeShwbG90bHkpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGxwU29sdmUpCgpzb2x2ZV9wZW5hbHR5X2dhbWUgPC0gZnVuY3Rpb24oQSkgewogIGlmICghaXMubWF0cml4KEEpIHx8IGFueShkaW0oQSkgIT0gYygzLCAzKSkpIHN0b3AoIkEgbXVzdCBiZSBhIDN4MyBtYXRyaXgiKQogIAogICMgS2lja2VyIExQOiBtYXggdiBzdWNoIHRoYXQgdChwKSAlKiUgQSA+PSB2LCBzdW0ocCkgPSAxLCBwID49IDAKICBmLm9iaiA8LSBjKDAsIDAsIDAsIDEpCiAgZi5jb24gPC0gcmJpbmQoCiAgICBjKEFbMSwgXSwgLTEpLAogICAgYyhBWzIsIF0sIC0xKSwKICAgIGMoQVszLCBdLCAtMSksCiAgICBjKDEsIDEsIDEsIDApCiAgKQogIGYuZGlyIDwtIGMoIj49IiwgIj49IiwgIj49IiwgIj09IikKICBmLnJocyA8LSBjKDAsIDAsIDAsIDEpCiAgcmVzdWx0IDwtIGxwKCJtYXgiLCBmLm9iaiwgZi5jb24sIGYuZGlyLCBmLnJocykKICAjaWYgKHJlc3VsdCRzdGF0dXMgIT0gMCB8fCBpcy5udWxsKHJlc3VsdCRzb2x1dGlvbikpIHJldHVybihyZXAoTkEsIDcpKQogIHFfc3RhciA8LSByZXN1bHQkc29sdXRpb25bMTozXSAjcmV0dXJuIGdvYWxrZWVwZXIgc3RyYXRlZ3kKICAjaWYgKHN1bShxX3N0YXIpID09IDApIHJldHVybihyZXAoTkEsIDcpKQogIHFfc3RhciA8LSBxX3N0YXIgLyBzdW0ocV9zdGFyKQogIHZfc3RhciA8LSByZXN1bHQkb2JqdmFsCgogICMgR29hbGtlZXBlciBMUDogbWluIHYgc3VjaCB0aGF0IEFeVCAlKiUgcCA8PSB2LCBzdW0ocCkgPSAxLCBwID49IDAKICBnLm9iaiA8LSBjKDAsIDAsIDAsIDEpCiAgZy5jb24gPC0gcmJpbmQoCiAgICBjKEFbLDFdLCAtMSksCiAgICBjKEFbLDJdLCAtMSksCiAgICBjKEFbLDNdLCAtMSksCiAgICBjKDEsIDEsIDEsIDApCiAgKQogIGcuZGlyIDwtIGMoIjw9IiwgIjw9IiwgIjw9IiwgIj09IikKICBnLnJocyA8LSBjKDAsIDAsIDAsIDEpCiAgcmVzdWx0MiA8LSBscCgibWluIiwgZy5vYmosIGcuY29uLCBnLmRpciwgZy5yaHMpCiAgI2lmIChyZXN1bHQyJHN0YXR1cyAhPSAwIHx8IGlzLm51bGwocmVzdWx0MiRzb2x1dGlvbikpIHJldHVybihyZXAoTkEsIDcpKQogIHBfc3RhciA8LSByZXN1bHQyJHNvbHV0aW9uWzE6M10gI3JldHVybiBraWNrZXIgc3RyYXRlZ3kKICAjaWYgKHN1bShwX3N0YXIpID09IDApIHJldHVybihyZXAoTkEsIDcpKQogIHBfc3RhciA8LSBwX3N0YXIgLyBzdW0ocF9zdGFyKQoKICByZXR1cm4oYyhwX3N0YXIsIHFfc3Rhciwgdl9zdGFyKSkKfQpgYGAKCgpgYGB7cn0KYV92YWxzIDwtIHNlcSgwLjAsIDAuNSwgbGVuZ3RoLm91dCA9IDgpCmVfdmFscyA8LSBzZXEoMC4wLCAwLjUsIGxlbmd0aC5vdXQgPSA4KQpiX3ZhbHMgPC0gc2VxKDAuNSwgMS4wLCBsZW5ndGgub3V0ID0gOCkKY192YWxzIDwtIHNlcSgwLjUsIDEuMCwgbGVuZ3RoLm91dCA9IDgpCmRfdmFscyA8LSBzZXEoMC41LCAxLjAsIGxlbmd0aC5vdXQgPSA4KQoKI0VYUEFORCBHUklECnBhcmFtX2dyaWQgPC0gZXhwYW5kLmdyaWQoYSA9IGFfdmFscywgYiA9IGJfdmFscywgYyA9IGNfdmFscywgZCA9IGRfdmFscywgZSA9IGVfdmFscykgCgpyZXN1bHRzIDwtIGRhdGEuZnJhbWUoKQoKZm9yIChpIGluIDE6bnJvdyhwYXJhbV9ncmlkKSkgewogIGEgPC0gcGFyYW1fZ3JpZCRhW2ldCiAgYiA8LSBwYXJhbV9ncmlkJGJbaV0KICBjIDwtIHBhcmFtX2dyaWQkY1tpXQogIGQgPC0gcGFyYW1fZ3JpZCRkW2ldCiAgZSA8LSBwYXJhbV9ncmlkJGVbaV0KICAKICAjIENvbnN0cnVjdCBzeW1tZXRyaWMgbWF0cml4IHdpdGhvdXQgbm9pc2UKICBBIDwtIG1hdHJpeChjKAogICAgYSwgYiwgYywKICAgIGQsIGUsIGQsCiAgICBjLCBiLCBhCiAgKSwgbnJvdyA9IDMsIGJ5cm93ID0gVFJVRSkKICAKICBvdXQgPC0gc29sdmVfcGVuYWx0eV9nYW1lKEEpCgogIHJlc3VsdHMgPC0gcmJpbmQocmVzdWx0cywgZGF0YS5mcmFtZSgKICAgIGEgPSBhLCBiID0gYiwgYyA9IGMsIGQgPSBkLCBlID0gZSwKICAgIHBMID0gb3V0WzFdLCBwQyA9IG91dFsyXSwgcFIgPSBvdXRbM10sCiAgICBxTCA9IG91dFs0XSwgcUMgPSBvdXRbNV0sIHFSID0gb3V0WzZdLAogICAgdiA9IG91dFs3XQogICkpCn0KYGBgCgoKYGBge3J9CmxpYnJhcnkoUE5XQ29sb3JzKQpsaWJyYXJ5KGdncGxvdDIpCnBhbCA9IHBud19wYWxldHRlKCJCYXkiLDEwMCx0eXBlPSJjb250aW51b3VzIikKCmdncGxvdChyZXN1bHRzLCBhZXMoeCA9IGQsIHkgPSBlLCBmaWxsID0gcEMpKSArCiAgZ2VvbV90aWxlKCkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBwYWwpCiAgbGFicygKICAgIHRpdGxlID0gIkVxdWlsaWJyaXVtIHByb2JhYmlsaXR5IG9mIHNob290aW5nIENlbnRlciIsCiAgICB4ID0gImQgKG9mZi1jZW50ZXIgcGF5b2ZmKSIsCiAgICB5ID0gImUgKGNlbnRlciBwYXlvZmYpIgogICkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCjNEIGhlYXQgbWFwIGJhc2VkIG9uIGEsIGQsIGMgcHJvYmFiaWxpdHkKYGBge3J9CnBsb3RseV9jb2xvcnNjYWxlIDwtIGxhcHBseSgwOjk5LCBmdW5jdGlvbihpKSB7CiAgbGlzdChpIC8gOTksIHBhbFtpICsgMV0pCn0pCgpwbG90X2x5KAogIGRhdGEgPSByZXN1bHRzLAogIHggPSB+YSwgeSA9IH5kLCB6ID0gfmMsIGNvbG9yID0gfnFMLCB0eXBlID0gInNjYXR0ZXIzZCIsIG1vZGUgPSAibWFya2VycyIsCiAgbWFya2VyID0gbGlzdChzaXplID0gMywgY29sb3JzY2FsZSA9IHBsb3RseV9jb2xvcnNjYWxlLCBjb2xvcmJhciA9IGxpc3QodGl0bGUgPSAicSpfTCIpKSwKICBzaG93c2NhbGUgPSBUUlVFCikgJT4lCiAgbGF5b3V0KAogICAgdGl0bGUgPSAiR29hbGtlZXBlcidzIGVxdWlsaWJyaXVtIHByb2JhYmlsaXR5IG9mIGRpdmluZyBMZWZ0IChxKl9MKSIsCiAgICBzY2VuZSA9IGxpc3QoCiAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJhIiksCiAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJkIiksCiAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJjIikKICAgICkKICApCmBgYAoKYGBge3J9Cm5fcG9pbnRzIDwtIDUgICMgY29udHJvbCByZXNvbHV0aW9uIChhZGp1c3QgZm9yIHNwZWVkIHZzIGdyYW51bGFyaXR5KQp2YWxzXzAxIDwtIHNlcSgwLjAsIDAuNSwgbGVuZ3RoLm91dCA9IG5fcG9pbnRzKQp2YWxzXzA1IDwtIHNlcSgwLjUsIDEuMCwgbGVuZ3RoLm91dCA9IG5fcG9pbnRzKQoKIyBHcmlkIGZvciBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoCmdyaWRfcmF3IDwtIGV4cGFuZC5ncmlkKAogIGEgPSB2YWxzXzAxLAogIGIgPSB2YWxzXzA1LAogIGMgPSB2YWxzXzA1LAogIGQgPSB2YWxzXzA1LAogIGUgPSB2YWxzXzAxLAogIGYgPSB2YWxzXzA1LAogIGcgPSB2YWxzXzA1LAogIGggPSB2YWxzXzAxCikKCnBhcmFtX2dyaWQyIDwtIGdyaWRfcmF3ICU+JQogIGZpbHRlcihhID4gaCwgYiA+IGcsIGMgPiBmKQoKcmVzdWx0czIgPC0gZGF0YS5mcmFtZSgpCgpmb3IgKGkgaW4gMTpucm93KHBhcmFtX2dyaWQyKSkgewogIGEgPC0gcGFyYW1fZ3JpZDIkYVtpXQogIGIgPC0gcGFyYW1fZ3JpZDIkYltpXQogIGMgPC0gcGFyYW1fZ3JpZDIkY1tpXQogIGQgPC0gcGFyYW1fZ3JpZDIkZFtpXQogIGUgPC0gcGFyYW1fZ3JpZDIkZVtpXQogIGYgPC0gcGFyYW1fZ3JpZDIkZltpXQogIGcgPC0gcGFyYW1fZ3JpZDIkZ1tpXQogIGggPC0gcGFyYW1fZ3JpZDIkaFtpXQogIAogICMgQ29uc3RydWN0IHN5bW1ldHJpYyBtYXRyaXggd2l0aG91dCBub2lzZQogIEEgPC0gbWF0cml4KGMoCiAgICBhLCBiLCBjLAogICAgZCwgZSwgZCwKICAgIGYsIGcsIGgKICApLCBucm93ID0gMywgYnlyb3cgPSBUUlVFKQogIAogIG91dCA8LSBzb2x2ZV9wZW5hbHR5X2dhbWUoQSkKCiAgcmVzdWx0czIgPC0gcmJpbmQocmVzdWx0czIsIGRhdGEuZnJhbWUoCiAgICBhID0gYSwgYiA9IGIsIGMgPSBjLCBkID0gZCwgZSA9IGUsIGYgPSBmLCBnID0gZywgaCA9IGgsCiAgICBwTCA9IG91dFsxXSwgcEMgPSBvdXRbMl0sIHBSID0gb3V0WzNdLAogICAgcUwgPSBvdXRbNF0sIHFDID0gb3V0WzVdLCBxUiA9IG91dFs2XSwKICAgIHYgPSBvdXRbN10KICApKQp9CmBgYApgYGB7cn0KZ2dwbG90KHJlc3VsdHMyLCBhZXMoeCA9IGQsIHkgPSBlLCBmaWxsID0gcEMpKSArCiAgZ2VvbV90aWxlKCkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBwYWwpCiAgbGFicygKICAgIHRpdGxlID0gIkVxdWlsaWJyaXVtIHByb2JhYmlsaXR5IG9mIHNob290aW5nIENlbnRlciIsCiAgICB4ID0gImQgKG9mZi1jZW50ZXIgcGF5b2ZmKSIsCiAgICB5ID0gImUgKGNlbnRlciBwYXlvZmYpIgogICkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyfQpwbG90X2x5KAogIGRhdGEgPSByZXN1bHRzMiwKICB4ID0gfmEsIHkgPSB+ZCwgeiA9IH5jLCBjb2xvciA9IH5xTCwgdHlwZSA9ICJzY2F0dGVyM2QiLCBtb2RlID0gIm1hcmtlcnMiLAogIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDMsIGNvbG9yc2NhbGUgPSBwbG90bHlfY29sb3JzY2FsZSwgY29sb3JiYXIgPSBsaXN0KHRpdGxlID0gInEqX0wiKSksCiAgc2hvd3NjYWxlID0gVFJVRQopICU+JQogIGxheW91dCgKICAgIHRpdGxlID0gIkdvYWxrZWVwZXIncyBlcXVpbGlicml1bSBwcm9iYWJpbGl0eSBvZiBkaXZpbmcgTGVmdCAocSpfTCkiLAogICAgc2NlbmUgPSBsaXN0KAogICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiYSIpLAogICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiZCIpLAogICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAiYyIpCiAgICApCiAgKQpgYGAKCg==